import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  Query,
  UseGuards,
  UseInterceptors,
  UploadedFile,
  UploadedFiles,
  Session,
  Req,
} from '@nestjs/common';
import { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express';
import {
  ApiTags,
  ApiOperation,
  ApiResponse,
  ApiConsumes,
} from '@nestjs/swagger';
import { Request } from 'express';
import { JwtAuthGuard } from '@wwjCommon/security/guards/jwt-auth.guard';
import { RolesGuard } from '@wwjCommon/security/guards/roles.guard';
import { Roles } from '@wwjCommon/security/decorators/roles.decorator';
import { Public } from '@wwjCommon/security/decorators/public.decorator';
import { BusinessException } from '@wwjCommon/exception/business.exception';
// @UploadedFile() - 单文件上传，配合 @UseInterceptors(FileInterceptor('file'))
// @UploadedFiles() - 多文件上传，配合 @UseInterceptors(FilesInterceptor('files'))
// @Session() - 获取会话对象，对应PHP Session::get()
// @Req() - 获取Request对象，对应PHP Request
import { MenuService } from '../../services/admin/menu.service';

/**
 * MenuController
 * 对应 PHP: Menu Controller
 * 对应 Java: @RestController
 *
 * 支持装饰器：
 * - @UploadedFile() - 单文件上传 (对应PHP Request::file())
 * - @UploadedFiles() - 多文件上传
 * - @Session() - 会话管理 (对应PHP Session::get())
 * - @Req() - 请求对象 (对应PHP Request)
 */
@ApiTags('sys')
@Controller('adminapi/sys')
export class MenuController {
  constructor(private readonly menuService: MenuService) {}

  /**
   * 菜单管理
   * 路由: GET menu/:app_type
   * PHP路由: Route::get('menu/:app_type', 'sys.Menu/lists')
   */
  @Get('menu/:app_type')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @ApiOperation({ summary: '菜单管理' })
  async lists(@Param('app_type') app_type: string): Promise<ApiResponse> {
    try {
      // 基于PHP真实逻辑实现
      // PHP原始方法: lists

      return await this.menuService.getAllMenuList(app_type, 'all', 1);
    } catch (error) {
      throw new BusinessException('lists操作失败', error);
    }
  }

  /**
   * 菜单管理
   * 路由: GET menu/:app_type/info/:menu_key
   * PHP路由: Route::get('menu/:app_type/info/:menu_key', 'sys.Menu/info')
   */
  @Get('menu/:app_type/info/:menu_key')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @ApiOperation({ summary: '菜单管理' })
  async info(
    @Param('app_type') app_type: string,
    @Param('menu_key') menu_key: string,
  ): Promise<ApiResponse> {
    try {
      // 基于PHP真实逻辑实现
      // PHP原始方法: info

      return await this.menuService.get(app_type, menu_key);
    } catch (error) {
      throw new BusinessException('info操作失败', error);
    }
  }

  /**
   * 菜单管理
   * 路由: POST menu
   * PHP路由: Route::post('menu', 'sys.Menu/add')
   */
  @Post('menu')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @ApiOperation({ summary: '菜单管理' })
  async add(@Body() data: AddDto): Promise<ApiResponse> {
    try {
      // 基于PHP真实逻辑实现
      // PHP原始方法: add

      return await this.menuService.add(data);
    } catch (error) {
      throw new BusinessException('add操作失败', error);
    }
  }

  /**
   * 菜单管理
   * 路由: PUT menu/:app_type/:menu_key
   * PHP路由: Route::put('menu/:app_type/:menu_key', 'sys.Menu/edit')
   */
  @Put('menu/:app_type/:menu_key')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @ApiOperation({ summary: '菜单管理' })
  async edit(
    @Param('app_type') app_type: string,
    @Param('menu_key') menu_key: string,
    @Body() data: EditDto,
  ): Promise<ApiResponse> {
    try {
      // 基于PHP真实逻辑实现
      // PHP原始方法: edit

      return await this.menuService.edit(app_type, menu_key, data);
    } catch (error) {
      throw new BusinessException('edit操作失败', error);
    }
  }

  /**
   * 菜单管理
   * 路由: GET menutype
   * PHP路由: Route::get('menutype', 'sys.Menu/getMenuType')
   */
  @Get('menutype')
  @ApiOperation({ summary: '菜单管理' })
  async getMenuType() {
    try {
      // 基于PHP真实逻辑实现
      // PHP原始方法: getMenuType
      // 直接返回字典数据
      return MenuTypeDict.getMenuType();
    } catch (error) {
      throw new BusinessException('getMenuType操作失败', error);
    }
  }

  /**
   * 菜单管理
   * 路由: GET menu/mothod
   * PHP路由: Route::get('menu/mothod', 'sys.Menu/getMethodType')
   */
  @Get('menu/mothod')
  @ApiOperation({ summary: '菜单管理' })
  async getMethodType() {
    try {
      // 基于PHP真实逻辑实现
      // PHP原始方法: getMethodType
      // 直接返回字典数据
      return MethodDict.getMethodType();
    } catch (error) {
      throw new BusinessException('getMethodType操作失败', error);
    }
  }

  /**
   * 菜单管理
   * 路由: DELETE menu/:app_type/:menu_key
   * PHP路由: Route::delete('menu/:app_type/:menu_key', 'sys.Menu/del')
   */
  @Delete('menu/:app_type/:menu_key')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @ApiOperation({ summary: '菜单管理' })
  async del(
    @Param('app_type') app_type: string,
    @Param('menu_key') menu_key: string,
  ): Promise<ApiResponse> {
    try {
      // 基于PHP真实逻辑实现
      // PHP原始方法: del

      return await this.menuService.del(app_type, menu_key);
    } catch (error) {
      throw new BusinessException('del操作失败', error);
    }
  }

  /**
   * 菜单管理
   * 路由: POST menu/refresh
   * PHP路由: Route::post('menu/refresh', 'sys.Menu/refreshMenu')
   */
  @Post('menu/refresh')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @ApiOperation({ summary: '菜单管理' })
  async refreshMenu(@Body() data: RefreshMenuDto): Promise<ApiResponse> {
    try {
      // 基于PHP真实逻辑实现
      // PHP原始方法: refreshMenu

      return await this.installSystemService.install();
    } catch (error) {
      throw new BusinessException('refreshMenu操作失败', error);
    }
  }

  /**
   * 菜单管理
   * 路由: GET menu/system_menu
   * PHP路由: Route::get('menu/system_menu', 'sys.Menu/getSystem')
   */
  @Get('menu/system_menu')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @ApiOperation({ summary: '菜单管理' })
  async getSystem(): Promise<ApiResponse> {
    try {
      // 基于PHP真实逻辑实现
      // PHP原始方法: getSystem

      return await this.menuService.getSystemMenu('all', 1);
    } catch (error) {
      throw new BusinessException('getSystem操作失败', error);
    }
  }

  /**
   * 菜单管理
   * 路由: GET menu/addon_menu/:app_key
   * PHP路由: Route::get('menu/addon_menu/:app_key', 'sys.Menu/getAddonMenu')
   */
  @Get('menu/addon_menu/:app_key')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @ApiOperation({ summary: '菜单管理' })
  async getAddonMenu(@Param('app_key') app_key: string): Promise<ApiResponse> {
    try {
      // 基于PHP真实逻辑实现
      // PHP原始方法: getAddonMenu

      return await this.menuService.getAddonMenu(app_key, 'all', 1);
    } catch (error) {
      throw new BusinessException('getAddonMenu操作失败', error);
    }
  }

  /**
   * 菜单管理
   * 路由: GET menu/dir/:addon
   * PHP路由: Route::get('menu/dir/:addon', 'sys.Menu/getMenuByTypeDir')
   */
  @Get('menu/dir/:addon')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @ApiOperation({ summary: '菜单管理' })
  async getMenuByTypeDir(@Param('addon') addon: string): Promise<ApiResponse> {
    try {
      // 基于PHP真实逻辑实现
      // PHP原始方法: getMenuByTypeDir

      return await this.menuService.getMenuByTypeDir(addon);
    } catch (error) {
      throw new BusinessException('getMenuByTypeDir操作失败', error);
    }
  }
}
